const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const path = require('path');
const fs = require('fs');

// 日志级别定义
const levels = {
  error: 0,
  warn: 1,
  info: 2,
  debug: 3
};

// 日志颜色定义
const colors = {
  error: 'red',
  warn: 'yellow',
  info: 'green',
  debug: 'blue'
};

// 添加颜色支持
winston.addColors(colors);

// 创建日志格式
const logFormat = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.errors({ stack: true }),
  winston.format.splat(),
  winston.format.json()
);

// 控制台输出格式
const consoleFormat = winston.format.combine(
  winston.format.colorize({ all: true }),
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
  winston.format.printf(
    info => `${info.timestamp} ${info.level}: ${info.message}`
  )
);

// 创建日志目录
const logDir = path.join(__dirname, '../../../logs');
try {
  if (!fs.existsSync(logDir)) {
    fs.mkdirSync(logDir, { recursive: true });
  }
} catch (error) {
  console.error('创建日志目录失败:', error);
  process.exit(1);
}

// 设置默认日志级别，优先使用环境变量，否则根据环境确定默认级别
const defaultLogLevel = process.env.LOG_LEVEL || 
  (process.env.NODE_ENV === 'production' ? 'info' : 'warn');

// 创建日志记录器
const logger = winston.createLogger({
  levels,
  format: logFormat,
  transports: [
    // 错误日志
    new DailyRotateFile({
      filename: path.join(logDir, 'error-%DATE%.log'),
      datePattern: 'YYYY-MM-DD',
      level: 'error',
      maxFiles: '30d',
      handleExceptions: true,
      zippedArchive: true
    }),
    // 所有日志
    new DailyRotateFile({
      filename: path.join(logDir, 'combined-%DATE%.log'),
      datePattern: 'YYYY-MM-DD',
      level: defaultLogLevel,
      maxFiles: '30d',
      zippedArchive: true
    }),
    // 控制台输出
    new winston.transports.Console({
      format: consoleFormat,
      level: defaultLogLevel,
      handleExceptions: true
    })
  ],
  exitOnError: false // 不要因为日志错误而退出应用
});

// 添加一个过滤SQL语句的辅助方法
logger.logSQL = (msg) => {
  if (process.env.LOG_SQL === 'true') {
    logger.debug(msg);
  }
};

// 添加错误处理
logger.on('error', error => {
  console.error('日志记录器错误:', error);
});

module.exports = logger; 